﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using METODESA.Server.Data.Exceptions;
using METODESA.Server.Data.METODESA.Entity;
using NHibernate;

namespace METODESA.Server.Data.METODESA.Nhibernate
{
    public class ProductoDao:BaseDao
    {
       
        // Obtengo todos los productos que tengo en la Base de Datos
        public static IList<Producto> getAllProducto()
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession();
                return myISession.CreateCriteria(typeof(Producto)).List<Producto>();
            }
            catch (Exception e)
            {
                throw new ProductoNotExistsException("There's no product");
                return null;
            }
        }

        public static Producto getProductoById(int id)
        {
            Producto producto = null;
            Boolean flag = true;

            try
            {
                myISession = NHibernateHelper.GetCurrentSession();
                producto = (Producto)myISession.Load(typeof(Producto), id);
                flag = false;
            }
            catch (HibernateException e)
            {
                throw new ProductoNotExistsException("There's no product with the provided id");

            }

            if (flag)
            {
                
                return null;
            }

            return producto;
        }



        public static IList<Producto> getProductoByName(string name)
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession();
                ICriteria myCriteria = myISession.CreateCriteria(typeof (Producto));
                myCriteria.Add(NHibernate.Expression.Expression.Like("Nombre",'%'+name+'%'));
                IList<Producto> producto = myCriteria.List<Producto>();
                return producto;
            }
            catch (Exception e)
            {
                throw new ProductoNotExistsException("There's no product with the provided name");
                return null;
            }
        }

        //muestra todos los productos con una categoria parecida al string de parametro
        public static IList<Producto> getProductoByCategory(string category)
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession();
                ICriteria myCriteria = myISession.CreateCriteria(typeof(Producto));
                myCriteria.Add(NHibernate.Expression.Expression.Like("Categoria","%"+category+"%"));
                IList<Producto> producto = myCriteria.List<Producto>();
                return producto;
            }
            catch (Exception e)
            {
                throw new ProductoNotExistsException("There's no product with the provided category");
                return null;
            }
        }

        // Muestra todos los productos de una categoria
        public static IList<Producto> getProductoByCategoria(string category)
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession();
                ICriteria myCriteria = myISession.CreateCriteria(typeof(Producto));
                myCriteria.Add(NHibernate.Expression.Expression.Like("Categoria", category ));
                IList<Producto> producto = myCriteria.List<Producto>();
                return producto;
            }
            catch (Exception e)
            {
                throw new ProductoNotExistsException("There's no product with the provided categoria");
                return null;
            }
        }

        public static IList getCategorias() // Nombres de todas las categorias
        {
            try
            {
                myISession = NHibernateHelper.GetCurrentSession(); //se obtiene la sesion

                String queryString1 = "select Distinct p.Categoria from Producto as p ";

                IQuery query = myISession.CreateQuery(queryString1); 
                IList a = query.List();

                return a;  //se ejecuta el query
            }
            catch (Exception e)
            {
                throw new ProductoNotExistsException("There's no category");
                return null;
            }
        }
    }
}
